package com.lenovo.leos.letools.lenovodata;

import java.io.File;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.util.Log;

import com.lenovo.leos.letools.db.FileDownloadService;
import com.lenovo.leos.letools.domain.Folder;
import com.lenovo.leos.letools.domain.LoadFile;
import com.lenovo.leos.letools.exception.NetException;
import com.lenovo.leos.letools.utils.JSONParser;
import com.lenovo.leos.letools.utils.ListFileUseParams;

/**
 * 下载文件夹及其所有子文件夹、文件
 * 
 * @author Administrator
 * 
 */
public class DownloadDirServer {

	private BaseNetClientServer baseClient;
	private FileDownloadService fileService;
	private Context context;
	
	public DownloadDirServer(Context context) {
		this.context=context;
		fileService = new FileDownloadService(context);// 打开数据库
		baseClient = new BaseNetClientServer();
	}
	
	
	/**
	 * 递归显示指定文件夹下的所有子文件夹
	 * 
	 * @param context
	 * @param folders
	 *            要下载同一级文件夹
	 * @param targetDir
	 *            目标路径 （也就是在这个路径下创建文件夹）
	 * @throws NetException 
	 * @throws Exception
	 *             File sdcardRoot = Environment.getExternalStorageDirectory();
	 */
	public void recursiveList(Context context,
			List<Folder> folders,int level) throws NetException {
		for (Folder folder : folders) {

			Log.i("dirId", "=========="+(level++)+"=" + folder);

			String dirInfObj = baseClient.listDir(context, folder.getId());
			List<Folder> dirIdInfs = null;
			try {
				dirIdInfs = JSONParser.parseListdirs(dirInfObj);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (dirIdInfs == null) {
				return;
			} else {
				recursiveList(context, dirIdInfs, level);
			}
		}
	}
	
	/**
	 * 递归的获得  文件夹和其下的文件
	 * @param context
	 * @param folders
	 * @param level
	 * @throws NetException 
	 * 
	 */
	public void recursiveDownloadFile(Context context, List<Folder> folders,
			int level) throws NetException{
		for (Folder folder : folders) {
			ListFileUseParams lfp = new ListFileUseParams();
			lfp.dirid = folder.getId();
			String fileInfObj = baseClient.listFile(context, lfp);// 得到指定文件夹下的所有子文件
			List<LoadFile> loadFiles=null;
			try {
				loadFiles = JSONParser.parseListFile(fileInfObj);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if(loadFiles!=null){
				for(LoadFile loadFile:loadFiles){
					Log.i("dirId","======dir and son file=====level"+level+" dir:"+folder.getName()+"--file:"+loadFile.getFilename());
				}
			}

			String dirInfObj = baseClient.listDir(context, folder.getId());
			List<Folder> dirIdInfs = null;
			try {
				dirIdInfs = JSONParser.parseListdirs(dirInfObj);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (dirIdInfs == null) {
				return;
			} else {
				recursiveDownloadFile(context, dirIdInfs, ++level);
			}
		}
	}
	
	/**
	 * 递归下载并在sdcard根目录下创建文件夹，
	 * 并将保存到本地的文件夹路径与它所对应的所有子文件放入一个map中
	 * 目的是下载文件的时候，从map中取出文件id并下载对应的dir中
	 * @param context
	 * @param folders
	 * @param targetDir
	 * @param dirFileMap
	 * @throws NetException 
	 * @throws Exception
	 */
	public void recursiveMapingWholePathAndFileInf(Context context,
			List<Folder> folders, File targetDir,Map<String,List<LoadFile>> dirFileMap) throws NetException {
		for (Folder folder : folders) {
			Log.i("dirId", "======dir wholePath=====" + targetDir.getPath());
			File dir = new File(targetDir, folder.getName());
			dir.mkdir();
			
			ListFileUseParams lfp = new ListFileUseParams();
			lfp.dirid = folder.getId();
			String fileInfObj = baseClient.listFile(context, lfp);// 得到指定文件夹下的所有子文件
			List<LoadFile> loadFiles=null;
			try {
				loadFiles = JSONParser.parseListFile(fileInfObj);
			} catch (Exception e1) {
				e1.printStackTrace();
			}
			if(loadFiles!=null){
				dirFileMap.put(dir.getPath(),loadFiles);
			}

			String dirInfObj = baseClient.listDir(context, folder.getId());
			List<Folder> dirIdInfs = null;
			try {
				dirIdInfs = JSONParser.parseListdirs(dirInfObj);
			} catch (Exception e) {
				e.printStackTrace();
			}
			if (dirIdInfs == null) {
				return;
			} else {
				recursiveMapingWholePathAndFileInf(context, dirIdInfs, dir,dirFileMap);
			}
		}
	}
	
}
